package com.zlzlib.libnetty.listener;


import com.zlzlib.libnetty.base.BaseChannelInitializer;
import com.zlzlib.libnetty.base.BaseClient;
import com.zlzlib.libnetty.ws.WebChannelInitializer;

import java.net.URI;

import io.netty.channel.Channel;
import io.netty.handler.codec.http.HttpHeaders;

/**
 * Created by zlz on 2019/11/18.
 * 与应用层交互
 */
public interface NettyEvenListener<T> {

    /**
     * 分发消息到应用层
     *
     * @param msg 回传的消息
     */
    void dispatchMsg(T msg);

    /**
     * 消息发送状态
     *
     * @param msg       消息
     * @param isSuccess 是否发送成功
     */
    void msgSendState(T msg, boolean isSuccess);

    /**
     * @return 从应用层获取网络是否可用
     */
    boolean isNetworkAvailable();

    /**
     * @return 获取重连间隔时长
     */
    int getReconnectInterval();

    /**
     * @return 获取连接超时时长
     */
    int getConnectTimeout();

    /**
     * @return 获取应用层消息发送超时重发次数
     */
    int getResendCount();

    /**
     * @return 获取应用层消息发送超时重发间隔
     */
    int getResendInterval();

    /**
     * @return 获取应用在前台时心跳间隔时间
     */
    int getForegroundHeartbeatInterval();

    /**
     * @return 获取应用在后台时心跳间隔时间
     */
    int getBackgroundHeartbeatInterval();

    /**
     * @param client 客户端
     * @return 获得Tcp初始化的配置  为空就是默认设置
     */
    <B extends Channel> BaseChannelInitializer<B> getTcpChannel(BaseClient<T> client);

    /**
     * @param socketListener 消息回调
     * @param url            请求地址  ws://localhost:xxx/ws
     * @param headers        请求头部
     * @return 获得WebSocket初始化的配置  为空就是默认设置
     */
    WebChannelInitializer getWebChannel(WebSocketListener socketListener, URI url, HttpHeaders headers);

}
